namespace Atom.Utility
{
    using System;
    using System.Configuration;

    public static class ProtectAppConfig
    {
        public static T OpenConfigFile<T>(string pathName, string stringSection) where T: ConfigurationSection
        {
            System.Configuration.Configuration configuration = null;
            T section = default(T);
            try
            {
                ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
                fileMap.ExeConfigFilename = pathName;
                configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
                if (configuration != null)
                {
                    section = configuration.GetSection(stringSection) as T;
                }
            }
            catch (Exception exception)
            {
                throw exception;
            }
            return section;
        }

        public static void ProtectConfigFiles(string pathName, string protectProvider, string protectSection)
        {
            if (protectSection == "All")
            {
                ToggleConnectionStringProtection(pathName, true, protectProvider);
                ToggleAppSettingProtection(pathName, true, protectProvider);
            }
            else if (protectSection == "connectionStrings")
            {
                ToggleConnectionStringProtection(pathName, true, protectProvider);
            }
            else
            {
                ToggleAppSettingProtection(pathName, true, protectProvider);
            }
        }

        private static void ToggleAppSettingProtection(string pathName, bool protect, string protectProvider)
        {
            System.Configuration.Configuration configuration = null;
            AppSettingsSection section = null;
            bool flag = false;
            try
            {
                ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
                fileMap.ExeConfigFilename = pathName;
                configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
                if (configuration != null)
                {
                    section = configuration.GetSection("appSettings") as AppSettingsSection;
                    if (section != null)
                    {
                        if (!section.ElementInformation.IsLocked && !section.SectionInformation.IsLocked)
                        {
                            if (protect)
                            {
                                if (!section.SectionInformation.IsProtected)
                                {
                                    flag = true;
                                    section.SectionInformation.ProtectSection(protectProvider);
                                }
                            }
                            else if (section.SectionInformation.IsProtected)
                            {
                                flag = true;
                                section.SectionInformation.UnprotectSection();
                            }
                        }
                        if (flag)
                        {
                            section.SectionInformation.ForceSave = true;
                            configuration.Save(ConfigurationSaveMode.Modified);
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }

        private static void ToggleConnectionStringProtection(string pathName, bool protect, string protectProvider)
        {
            System.Configuration.Configuration configuration = null;
            ConnectionStringsSection section = null;
            bool flag = false;
            try
            {
                ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
                fileMap.ExeConfigFilename = pathName;
                configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
                if (configuration != null)
                {
                    section = configuration.GetSection("connectionStrings") as ConnectionStringsSection;
                    if (section != null)
                    {
                        if (!section.ElementInformation.IsLocked && !section.SectionInformation.IsLocked)
                        {
                            if (protect)
                            {
                                if (!section.SectionInformation.IsProtected)
                                {
                                    flag = true;
                                    section.SectionInformation.ProtectSection(protectProvider);
                                }
                            }
                            else if (section.SectionInformation.IsProtected)
                            {
                                flag = true;
                                section.SectionInformation.UnprotectSection();
                            }
                        }
                        if (flag)
                        {
                            section.SectionInformation.ForceSave = true;
                            configuration.Save(ConfigurationSaveMode.Modified);
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }

        public static void UnProtectConfigFiles(string pathName, string protectProvider, string protectSection)
        {
            if (protectSection == "All")
            {
                ToggleConnectionStringProtection(pathName, false, protectProvider);
                ToggleAppSettingProtection(pathName, false, protectProvider);
            }
            else if (protectSection == "connectionStrings")
            {
                ToggleConnectionStringProtection(pathName, false, protectProvider);
            }
            else
            {
                ToggleAppSettingProtection(pathName, false, protectProvider);
            }
        }

        public static bool UpdateConnectionString(string pathName, string stringSection, string strContent)
        {
            System.Configuration.Configuration configuration = null;
            ConnectionStringsSection section = null;
            AppSettingsSection section2 = null;
            bool flag = false;
            try
            {
                ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
                fileMap.ExeConfigFilename = pathName;
                if (fileMap != null)
                {
                    configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
                }
                if (configuration == null)
                {
                    return flag;
                }
                if (stringSection == "connectionStrings")
                {
                    section = configuration.GetSection(stringSection) as ConnectionStringsSection;
                    if ((section != null) && !(section.ElementInformation.IsLocked || section.SectionInformation.IsLocked))
                    {
                        section.ConnectionStrings["FBMSConnection"].ConnectionString = strContent;
                        section.SectionInformation.ForceSave = true;
                        configuration.Save(ConfigurationSaveMode.Modified);
                        flag = true;
                    }
                    return flag;
                }
                if (!(stringSection == "appSettings"))
                {
                    return flag;
                }
                section2 = configuration.GetSection(stringSection) as AppSettingsSection;
                if (section2 == null)
                {
                    return flag;
                }
                if (!(section2.ElementInformation.IsLocked || section2.SectionInformation.IsLocked))
                {
                    section2.Settings["VerifyURL"].Value = strContent;
                    section2.SectionInformation.ForceSave = true;
                    configuration.Save(ConfigurationSaveMode.Modified);
                    flag = true;
                }
            }
            catch (Exception exception)
            {
                throw exception;
            }
            return flag;
        }
    }
}
